﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
//需要使用死循环+输入的场景就不用举例了
//在C++中，提供了cin函数，其可以配合while1实现上述需求
//而循环结束条件为（二者之一即可）：
//1.​​输入结束符（EOF）​​
//​​操作​​：在 Windows 下按 Ctrl + Z + Enter，Linux / macOS 下按 Ctrl + D。
//​​效果​​：cin检测到文件结束符（EOF），设置 eofbit，循环条件返回 false
//2.输入类型不匹配​​
//​​场景​​：若 vector<int> v期望输入整数，但用户输入了字符（如 "abc"）。
//​​效果​​：cin设置 failbit，导致 operator>>返回的 cin被转换为 false，循环终止

//测试用例：
void test1()
{
	vector<int> v;
	int i = 0;
	while (cin >> i)//windows下Ctrl+z + Enter即可结束
	{
		v.push_back(i);
	}
	for (const auto& e : v)
	{
		cout << e << " ";
	}
	cout << endl;
}

//需要注意的是，虽然两种方法都可做到仅结束死循环，使程序继续运行
//但使用法二会导致有数据留存在缓冲区，导致cin产生了错误标志 failbit，
//由于cin不会自动恢复状态，所以这会导致后续所以的cin全部失效，
//可以使用cin.clear函数重置cin的错误标志+cin.ignore函数清除缓冲区直到换行符来解决这个问题

//cin.clear()函数作用为重置cin的状态，可用于清除输入不符合类型的字符造成的错误标志failbit
//cin.ignore()为清除缓冲区留存内容的函数，其原型为：
//istream& ignore(int n = 1, int delim = EOF);
//第一个参数n为忽略多少字符数时停止继续，第二个参数为到那个字符时停止（注：第二个参数代表的字符本身也会被清理）
//也就是说，ignore这个函数具备两个停止条件，只要满足其中之一就能停止函数
//当面对上述不知道需要清理多少个缓冲区字符的情况时，第一个参数可以写成
//numeric_limits<streamsize>::max()（安全上限），这样就不用担心在第二个截至条件前停止清理了

//ignore示例
void test2()
{
	vector<int> v;
	int i = 0;
	while (cin >> i)//windows下Ctrl+z + Enter即可结束
	{
		v.push_back(i);
	}
	int a = 0;
	//输入非所需类型输入，则需要使用cin.ignore函数清理缓冲区，否则后续cin会失效
	cin >> a;
	cout << a << endl;

	//重置错误标志+清理缓冲区后，cin便可以正常运作了
	cin.clear();//清除 failbit 等错误标志
	//也可使用getchar()来清理缓冲区（但getchar为C风格函数，不推荐与cin混合使用）
	//while(getchar() != '\n');
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	int b = 0;
	cin >> b;
	cout << b << endl;
}

int main()
{
	//test1();
	test2();
	return 0;
}